package com.ppt.android.base.utils;


import com.ppt.android.BuildConfig;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * @author ZouJiaCai
 * @since 2023/4/25 17:09
 */
public class DecimalFormatUtils {
    public static String getDouble8(String text,int scale){
        if(text.contains(".")){
            text = text+"00000000";
            return getDoubleN(text ,scale);
        }else{
            text = text+".00000000";
            return getDoubleN(text ,scale);
        }
    }

    /**
     * @param text
     * @return String    返回类型
     * @Title: fmtMicrometer
     * @Description: 格式化数字为千分位
     */
    public static String fmtMicrometer(String text) {
        DecimalFormat df = null;
        if (text.indexOf(".") > 0) {
            if (text.length() - text.indexOf(".") - 1 == 0) {
                df = new DecimalFormat("###,##0.");
            } else if (text.length() - text.indexOf(".") - 1 == 1) {
                df = new DecimalFormat("###,##0.0");
            } else {
                df = new DecimalFormat("###,##0.00");
            }
        } else {
            df = new DecimalFormat("###,##0");
        }
        double number = 0.00;
        try {
            number = getDouble2(text);
        } catch (Exception e) {
            number = 0.00;
        }
        return df.format(number);
    }



    /**
     * 提供精确减法运算的sub方法
     * @param value1 被减数
     * @param value2 减数
     * @return 两个参数的差
     */
    public static String sub(String value1,String value2){
        try {
            BigDecimal b1 = new BigDecimal(value1);
            BigDecimal b2 = new BigDecimal(value2);
            return b1.subtract(b2).toPlainString();
        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            return "0";
        }
    }
    /**
     * 提供精确减法运算的sub方法
     * @param value1 被减数
     * @param value2 减数
     * @return 两个参数的差
     */
    public static String subWithScale(String value1,String value2){
        try {
            BigDecimal b1 = new BigDecimal(value1);
            BigDecimal b2 = new BigDecimal(value2);
            return b1.subtract(b2).toPlainString();

        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            return "0";
        }
    }

    /**
     * 提供精确加法计算的add方法
     * @param value1 被加数
     * @param value2 加数
     * @return 两个参数的和
     */
    public static String add(String value1,String value2){
        try {
            BigDecimal b1 = new BigDecimal(value1);
            BigDecimal b2 = new BigDecimal(value2);
            return b1.add(b2).toPlainString();
        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            return "0";
        }

    }

    /**
     * 提供精确乘法运算的mul方法
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积
     */
    public static String multiply(String value1,String value2){
        try {
            BigDecimal b1 = new BigDecimal(value1);
            BigDecimal b2 = new BigDecimal(value2);
//            return b1.multiply(b2).toString();
            return b1.multiply(b2).toPlainString();
        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            return "0";
        }
    }

    /**
     * 提供精确的除法运算方法div
     * @param value1 被除数
     * @param value2 除数
     * @param scale 精确范围
     * @return 两个参数的商
     * @throws IllegalAccessException
     */
    public static String div(String value1,String value2,int scale) throws IllegalAccessException{
        //如果精确范围小于0，抛出异常信息
        if(scale<0){
            throw new IllegalAccessException("精确度不能小于0");
        }
        try {
            BigDecimal b1 = new BigDecimal(value1);
            BigDecimal b2 = new BigDecimal(value2);
            return b1.divide(b2,scale, BigDecimal.ROUND_HALF_UP).toPlainString();
        }catch (Exception e){
            if (BuildConfig.DEBUG)e.printStackTrace();
            return "0";
        }

    }


    /**
     * double 保留小数点后两位（不进行四舍五入）
     * 去除科学计数法
     * 如果需要四舍五入,将RoundingMode.DOWN 改为 RoundingMode.UP
     *
     *
     */
    public static Double getDouble2(String d){
        try {
            BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.DOWN);
            return bg.doubleValue();
        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            return new BigDecimal(0).setScale(2, RoundingMode.DOWN).doubleValue();
        }

    }

    /**
     * double 保留小数点后N位（不进行四舍五入）
     * 去除科学计数法
     * 如果需要四舍五入,将RoundingMode.DOWN 改为 RoundingMode.UP
     *
     *
     */
    public static String getDoubleN(String d,int n){
        try {
            BigDecimal bg = new BigDecimal(d).setScale(n, RoundingMode.DOWN);
            if (n >= 1){
                StringBuilder sb = new StringBuilder("0.");
                for (int i = 0 ; i< n; i++){
                    sb.append("0");
                }
                DecimalFormat df = new DecimalFormat(sb.toString());
                return df.format(bg);
            }else if (n == 0){
                return bg.stripTrailingZeros().toPlainString();
            }
            DecimalFormat df = new DecimalFormat("0");
            return df.format(bg);
        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            if (d.equals("**NIL**")){
                d = "0";
            }
            return d;
        }
    }

    /**
     * double 保留小数点后N位（进行四舍五入）
     * 去除科学计数法
     * 如果需要四舍五入,将RoundingMode.DOWN 改为 RoundingMode.UP
     *
     *
     */
    public static String getDoubleUpN(String d,int n){
        try {
            BigDecimal bg = new BigDecimal(d).setScale(n, RoundingMode.HALF_UP);
            if (n >= 1){
                StringBuilder sb = new StringBuilder("0.");
                for (int i = 0 ; i< n; i++){
                    sb.append("0");
                }
                DecimalFormat df = new DecimalFormat(sb.toString());
                return df.format(bg);
            }
            DecimalFormat df = new DecimalFormat("0");
            return df.format(bg);
        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            if (d.equals("**NIL**")){
                d = "0";
            }
            return d;
        }
    }


    /**
     * double 保留小数点后两位（进行四舍五入）
     * 去除科学计数法
     * 如果需要四舍五入,将RoundingMode.DOWN 改为 RoundingMode.UP
     *
     *
     */
    public static Double getDouble2up(String d){
        try {
            BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP);
            return bg.doubleValue();
        }catch (Exception e){
            if (BuildConfig.DEBUG){
                e.printStackTrace();
            }
            return new BigDecimal(0).setScale(2, RoundingMode.UP).doubleValue();
        }

    }

    //根据精度，获取最小单位
    public static String getAddOrSub(int i){
        Double a = Math.pow(10.0,-i);
        return getDoubleUpN(a.toString(),i);
    }
}
